#!/usr/bin/env bash
# 获取脚本当前所在路径
base_dir="$(cd `dirname $0`;pwd)"
# 定义 repo 文件的路径
repofile_dir="${base_dir}/repofiles"
# 定义日志的路径
log_dir="${base_dir}/logs"
# 获取当前时间
now_time="$(date +%F)"
# 日志内的时间格式
now_time_hms="%FT%H_%M_%S"
# 定义日志文件名称
log_file="${log_dir}/${now_time}.log"
# 仓库同步的路径
repo_data_dir='/data/nginx'
# 默认的 yum 源 repo 文件的路径
repo_src_dir='/etc/yum.repos.d'

# 定义错误日志内容格式
function error_log () {
  local log_time_style="$(date +${now_time_hms})"
  echo "[ERR] [${log_time_style}] [$@]" >> ${log_file}
}

# 定义标准日志内容格式
function info_log () {
  local log_time_style="$(date +${now_time_hms})"
  echo "[INF] [${log_time_style}] [$@]" >> ${log_file}
}

# createrepo 后的确认检查
function check_status () {
  if [ $? -eq 0 ];then
    info_log "createrepo ${@} success"
  else
    error_log "createrepo ${@} fail"
  fi
}

# 日志目录不存在就创建
[ -d "${log_dir}" ] || mkdir -p "${log_dir}"

# 循环同步 yum 仓库，要和 repofile_dir 的文件名称一样
for reponame in centos docker-ce epel kubernetes
do
  # 删除 repo 文件
  rm -f ${repo_src_dir}/*.repo
  # 复制 repo 文件模板到 repo 文件目录下
  cp ${repofile_dir}/${reponame}.repo ${repo_src_dir}/

  # 如果本地不存在目录，表示第一次同步，创建目录并设置 reposync 的参数是 -p
  if [ ! -d "${repo_data_dir}/${reponame}" ];then
    mkdir ${repo_data_dir}/${reponame}
    reposync_cmd="reposync -p"
  else
    # 如果本地存在目录，表示只需要同步最近的内容，设置 reposync 的参数是 -np
    reposync_cmd="reposync -np"
  fi

  # 开始同步仓库到本地
  ${reposync_cmd} ${repo_data_dir}/${reponame}
  if [ $? -eq 0 ];then
    info_log "sync ${reponame} success"

    # centos 有很多的仓库，这里做了独立的处理
    if [[ "${reponame}"x == "centos"x ]];then
      for repotype in base extras updates
      do
        # 使用 createrepo 来创建元数据索引
        createrepo -p ${repo_data_dir}/${reponame}/${repotype}/Packages/
        check_status "${reponame}/${repotype}"
      done
    fi

    # docker 虽然也有很多，这里只取了稳定版，所以统一处理了
    if [[ "${reponame}"x != "centos"x ]];then
      createrepo -p ${repo_data_dir}/${reponame}/${reponame}/Packages/
      check_status "${reponame}"
    fi

    # 清除本地 yum 缓存
    yum clean all
  else
    error_log "sync ${reponame} fail"
  fi
done

# 删除三天前的日志
find ${log_dir} -type f -name "*.log" -mtime +3 | xargs -i rm -f {}
